from xtquant import xtdata
import pandas as pd

# 下载并打印指定股票的日线数据

def download_and_print_daily_data(stock_code, start_date, end_date):
    """
    下载并打印指定股票的日线数据

    参数:
    stock_code (str): 股票代码，如 '000001.SZ'
    start_date (str): 开始日期，格式 'YYYYMMDD'，如 '20240101'
    end_date (str): 结束日期，格式 'YYYYMMDD'，如 '20241231'
    """
    try:
        # 设置股票代码列表
        stock_list = [stock_code]

        # 下载历史日线数据
        print(f"正在下载 {stock_code} 从 {start_date} 到 {end_date} 的日线数据...")
        xtdata.download_history_data(
            stock_code=stock_code,
            period='1d',  # 日线数据
            start_time=start_date,
            end_time=end_date
        )

        # 获取本地存储的日线数据
        print("数据下载完成，正在读取...")
        history_data = xtdata.get_market_data_ex(
            stock_list=stock_list,
            period='1d',  # 日线数据
            start_time=start_date,
            end_time=end_date,
            dividend_type='front',
            count=-1  # 获取全部数据
        )

        # 提取指定股票的数据
        if stock_code in history_data:
            df = history_data[stock_code]

            # 确保索引是日期格式（如果需要的话）
            if hasattr(df.index, 'dtype') and df.index.dtype == 'int64':
                # 如果索引是整数格式的日期（如20240101），转换为datetime
                df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
            elif hasattr(df.index, 'dtype') and df.index.dtype == 'object':
                # 如果索引是字符串格式的日期
                df.index = pd.to_datetime(df.index, format='%Y%m%d')

            # 打印数据基本信息
            print(f"\n{stock_code} 日线数据概览:")
            print("=" * 50)
            print(f"数据时间段: {start_date} 至 {end_date}")
            print(f"总交易天数: {len(df)}")
            print(f"数据列: {', '.join(df.columns.tolist())}")

            # 打印前10行数据
            print(f"\n前10个交易日数据:")
            print("-" * 80)
            print(f"{'日期':<12} {'开盘':<10} {'最高':<10} {'最低':<10} {'收盘':<10} {'成交量':<12} {'成交额':<12}")
            print("-" * 80)

            for i, (date, row) in enumerate(df.iterrows()):
                # if i >= 10:  # 只显示前10行
                #     break
                date_str = date.strftime('%Y-%m-%d') if hasattr(date, 'strftime') else str(date)
                print(f"{date_str:<12} {row.get('open', 0):<10.2f} {row.get('high', 0):<10.2f} "
                      f"{row.get('low', 0):<10.2f} {row.get('close', 0):<10.2f} "
                      f"{row.get('volume', 0):<12.0f} {row.get('amount', 0):<12.2f}")

            # 打印统计信息
            print(f"\n数据统计信息:")
            print("-" * 40)
            if 'close' in df.columns:
                close_prices = df['close']
                print(f"收盘价统计:")
                print(f"  最高价: {close_prices.max():.2f}")
                print(f"  最低价: {close_prices.min():.2f}")
                print(f"  平均价: {close_prices.mean():.2f}")
                print(f"  当前价: {close_prices.iloc[-1]:.2f}")

            return df

        else:
            print(f"错误: 未找到股票 {stock_code} 的数据")
            return None

    except Exception as e:
        print(f"操作失败，错误信息: {str(e)}")
        return None


# 使用示例
if __name__ == "__main__":
    # 设置参数
    stock_code = "002444.SZ"  # 股票代码（平安银行）
    start_date = "20251001"  # 开始日期
    end_date = "20251031"  # 结束日期（可根据需要调整）

    # 执行下载和打印
    data = download_and_print_daily_data(stock_code, start_date, end_date)

    # 如果成功获取数据，可以进一步处理
    if data is not None:
        print(f"\n数据已成功获取，DataFrame形状: {data.shape}")
        # 这里可以添加其他的数据处理逻辑